// 学生信息管理（方法与函数对比示例）
import scala.collection.mutable.ListBuffer

object FunctionVsMethodDemo extends App {
  // 定义学生样例类（存储学生信息）
  case class Student(id: String, name: String, var className: String, scores: Map[String, Int])

  // 学生数据库（可变ListBuffer存储）
  val students = ListBuffer[Student](
    Student("S2025001", "张三", "高一(1)班", Map("数学" -> 85, "语文" -> 90)),
    Student("S2025002", "李四", "高一(1)班", Map("数学" -> 92, "语文" -> 88)),
    Student("S2025003", "王五", "高一(2)班", Map("数学" -> 76, "语文" -> 82))
  )

  // 1. 类中的方法（Method）：与StudentManager实例关联
  class StudentManager {
    // 方法1：根据ID查询学生
    def findStudentById(studentId: String): Option[Student] = {
      students.find(_.id == studentId)
    }

    // 方法2：更新学生班级
    def updateStudentClass(studentId: String, newClass: String): Boolean = {
      findStudentById(studentId) match {
        case Some(student) =>
          student.className = newClass // 样例类var字段可修改
          true
        case None =>
          false // 未找到学生，返回更新失败
      }
    }
  }

  // 2. 独立函数（Function）：可赋值给变量，无实例关联
  // 函数1：计算学生平均分
  val calculateStudentAverage: Student => Double = (student) => {
    if (student.scores.isEmpty) 0.0
    else student.scores.values.sum.toDouble / student.scores.size
  }

  // 函数2：根据平均分获取学生等级
  val getStudentGrade: Student => String = (student) => {
    val avg = calculateStudentAverage(student)
    if (avg >= 90) "优秀"
    else if (avg >= 80) "良好"
    else if (avg >= 70) "中等"
    else if (avg >= 60) "及格"
    else "不及格"
  }

  // 3. 方法与函数的使用对比
  val manager = new StudentManager()

  // 使用方法（需通过StudentManager实例调用）
  val targetStudent = manager.findStudentById("S2025002")
  targetStudent match {
    case Some(s) => println(s"找到学生: ${s.name}, 班级: ${s.className}") // 输出：找到学生: 李四, 班级: 高一(1)班
    case None => println("未找到学生")
  }

  // 调用更新班级方法
  val updateSuccess = manager.updateStudentClass("S2025002", "高一(3)班")
  println(s"更新班级成功: $updateSuccess") // 输出：更新班级成功: true
  manager.findStudentById("S2025002").foreach(s =>
    println(s"更新后班级: ${s.className}") // 输出：更新后班级: 高一(3)班
  )

  // 使用函数（直接调用，可遍历集合使用）
  println("\n所有学生成绩分析:")
  students.foreach { s =>
    val avg = calculateStudentAverage(s)
    val grade = getStudentGrade(s)
    println(f"${s.name} 的平均分: $avg%.1f, 等级: $grade")
  }

  // 4. 方法转换为函数（使用下划线 _）
  val findFunc = manager.findStudentById _ // 将方法转为函数
  val result = findFunc("S2025001")
  println(s"\n通过函数查找: ${result.map(_.name)}") // 输出：通过函数查找: Some(张三)
}